package model;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;

import util.Constantes;
import util.Util;

import bean.DadosEntradaRNA;

public class OperacoesArquivos {
	
	public static int[] lerMaximos(String nomeDoArquivo){
		List<String> conteudo = lerTxt(nomeDoArquivo);
		String linha1 = conteudo.get(0);
		
		String[] itens = linha1.trim().split(",");
		int[] maximos = new int[itens.length];
		
		for (int i = 0; i < maximos.length; i++) {
			maximos[i] = Integer.parseInt(itens[i]);
		}
		
		return maximos;
	}
	
	public static List<String> lerTxt(String nomeDoArquivo){
		File fileTxt = new File(nomeDoArquivo);
		
		if(!fileTxt.exists()){
			System.out.println("Erro ao abrir arquivo:\n" + fileTxt.getAbsolutePath());
			return null;
		}
		
		try {
			BufferedReader bufferReader = new BufferedReader(new FileReader(fileTxt));
			List<String> bufferList = new ArrayList<String>();
			
			String linha = "";			
			while((linha = bufferReader.readLine()) != null){
				bufferList.add(linha);
			}
						
			bufferReader.close();
			return bufferList;
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public static void salvaDadosArquivoTexto(String linha, String nomeDoArquivo, boolean isSalvarNoFim){
        try {
			FileWriter file = new FileWriter(nomeDoArquivo, isSalvarNoFim);
			BufferedWriter writer = new BufferedWriter(file);
			
			writer.write(linha);
			writer.newLine();
			
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static String geraLinha(int[] maximos){
		String novalinha = "";
		String separador = ",";
		
		for (int i = 0; i < maximos.length; i++) {
			novalinha += maximos[i];
			
			if(i != maximos.length - 1){
				novalinha += separador;
			}
		}
		
		return novalinha;
	}
	
	public static String geraLinha(DadosEntradaRNA input){
		String novaLinha = "";
		String separador = ",";
		
		novaLinha += String.valueOf(input.getMa());
        novaLinha += separador;
        novaLinha += String.valueOf(input.getMb());
        novaLinha += separador;
        novaLinha += String.valueOf(input.getAa());
        novaLinha += separador;
        novaLinha += String.valueOf(input.getAb());
        novaLinha += separador;
        novaLinha += String.valueOf(input.getTa());
        novaLinha += separador;
        novaLinha += String.valueOf(input.getTb());
        novaLinha += separador;
        novaLinha += String.valueOf(input.getTd());
        novaLinha += separador;
        novaLinha += String.valueOf(input.getNa());
        novaLinha += separador;
        novaLinha += String.valueOf(input.getSaidaIdeal());
        
        return novaLinha;
	}

	
	public static boolean COPIA_ARQUIVO(File origemFile, File destinoFile){
		try{
			if(!origemFile.exists()){
				return false;
			}
			
			FileChannel origem = new FileInputStream(origemFile).getChannel();
			FileChannel destino = new FileOutputStream(destinoFile).getChannel();
			
			destino.transferFrom(origem, 0, origem.size());
			
			origem.close();
			destino.close();
			
			return true;
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
			return false;
		} catch (IOException e2) {
			e2.printStackTrace();
			return false;
		}
	}
	
	public static String RENOMEIA_ARQUIVOS(String nomeDoArquivo, int saidaIdeal, String tipoDiretorio) {
		char porte = Util.getPorte(saidaIdeal);
		
		File dirFileOriginal = null;
		File dirFileNorm = null;
		File dirFileZoom = null;
		File dirFilePan1 = null;
		File dirFilePan2 = null;
		File dirFileColeta = null;
		File dirFileMetro = null;
		File dirFileRNA = null;
		File dirFileReal = null;
		
		File fileOriginal = null;
		File fileNorm = null;
		File fileZoom = null;
		File filePan1 = null;
		File filePan2 = null;
		File fileColeta = null;
		File fileMetro = null;
		File fileRNA = null;
		File fileReal = null;
		
		if(tipoDiretorio.equalsIgnoreCase(Constantes.CONSISTENCIA)){
			dirFileOriginal = Constantes.DIRETORIO_PERFIL_CONSISTENCIA_FLUXO_ORIGINAL;
			dirFileNorm = Constantes.DIRETORIO_PERFIL_CONSISTENCIA_FLUXO_NORMALIZADO;
			dirFileZoom = Constantes.DIRETORIO_PERFIL_CONSISTENCIA_IMAGENS_ZOOM;
			dirFilePan1 = Constantes.DIRETORIO_PERFIL_CONSISTENCIA_IMAGENS_PAN_1;
			dirFilePan2 = Constantes.DIRETORIO_PERFIL_CONSISTENCIA_IMAGENS_PAN_2;
			dirFileColeta = Constantes.DIRETORIO_PERFIL_CONSISTENCIA_COLETA;
			
			fileOriginal = new File(dirFileOriginal, nomeDoArquivo + Constantes.EXTENSAO_TXT);
			fileNorm = new File(dirFileNorm, nomeDoArquivo + Constantes.EXTENSAO_TXT);
			fileZoom = new File(dirFileZoom, nomeDoArquivo + Constantes.EXTENSAO_JPG);
			filePan1 = new File(dirFilePan1, nomeDoArquivo + Constantes.EXTENSAO_JPG);
			filePan2 = new File(dirFilePan2, nomeDoArquivo + Constantes.EXTENSAO_JPG);
			fileColeta = new File(dirFileColeta, nomeDoArquivo + Constantes.EXTENSAO_CSV);
			
		} else if(tipoDiretorio.equalsIgnoreCase(Constantes.TESTES_RNA)){
			
		} else if(tipoDiretorio.equalsIgnoreCase(Constantes.ESTATISTICAS)){
			dirFileOriginal = Constantes.DIRETORIO_PERFIL_ESTATISTICA_FLUXO_ORIGINAL;
			dirFileNorm = Constantes.DIRETORIO_PERFIL_ESTATISTICA_FLUXO_NORMALIZADO;
			dirFileZoom = Constantes.DIRETORIO_PERFIL_ESTATISTICA_IMAGENS_ZOOM;
			dirFilePan1 = Constantes.DIRETORIO_PERFIL_ESTATISTICA_IMAGENS_PAN_1;
			dirFilePan2 = Constantes.DIRETORIO_PERFIL_ESTATISTICA_IMAGENS_PAN_2;
			dirFileColeta = Constantes.DIRETORIO_PERFIL_ESTATISTICA_CSV;
			dirFileMetro = Constantes.DIRETORIO_PERFIL_ESTATISTICA_METROLOGICO;
			dirFileRNA = Constantes.DIRETORIO_PERFIL_ESTATISTICA_RNA;
			dirFileReal = Constantes.DIRETORIO_PERFIL_ESTATISTICA_REAL;
			
			fileOriginal = new File(dirFileOriginal, nomeDoArquivo + Constantes.EXTENSAO_TXT);
			fileNorm = new File(dirFileNorm, nomeDoArquivo + Constantes.EXTENSAO_TXT);
			fileZoom = new File(dirFileZoom, nomeDoArquivo + Constantes.EXTENSAO_JPG);
			filePan1 = new File(dirFilePan1, nomeDoArquivo + Constantes.EXTENSAO_JPG);
			filePan2 = new File(dirFilePan2, nomeDoArquivo + Constantes.EXTENSAO_JPG);
			fileColeta = new File(dirFileColeta, nomeDoArquivo + Constantes.EXTENSAO_CSV);
			fileMetro = new File(dirFileMetro, nomeDoArquivo + Constantes.EXTENSAO_TXT);
			fileRNA = new File(dirFileRNA, nomeDoArquivo + Constantes.EXTENSAO_TXT);
			fileReal = new File(dirFileReal, nomeDoArquivo + Constantes.EXTENSAO_TXT);			
			
		} else if(tipoDiretorio.equalsIgnoreCase(Constantes.INDETERMINADOS)){
			dirFileOriginal = Constantes.DIRETORIO_PERFIL_INDETERMINADOS_FLUXO_ORIGINAL;
			dirFileNorm = Constantes.DIRETORIO_PERFIL_INDETERMINADOS_FLUXO_NORMALIZADO;
			dirFileZoom = Constantes.DIRETORIO_PERFIL_INDETERMINADOS_IMAGENS_ZOOM;
			dirFilePan1 = Constantes.DIRETORIO_PERFIL_INDETERMINADOS_IMAGENS_PAN_1;
			dirFilePan2 = Constantes.DIRETORIO_PERFIL_INDETERMINADOS_IMAGENS_PAN_2;
			dirFileColeta = Constantes.DIRETORIO_PERFIL_INDETERMINADOS_CSV;
			fileMetro = Constantes.DIRETORIO_PERFIL_INDETERMINADOS_METROLOGICO;
			fileRNA = Constantes.DIRETORIO_PERFIL_INDETERMINADOS_RNA;
			fileReal = Constantes.DIRETORIO_PERFIL_INDETERMINADOS_REAL;
			
			fileOriginal = new File(dirFileOriginal, nomeDoArquivo + Constantes.EXTENSAO_TXT);
			fileNorm = new File(dirFileNorm, nomeDoArquivo + Constantes.EXTENSAO_TXT);
			fileZoom = new File(dirFileZoom, nomeDoArquivo + Constantes.EXTENSAO_JPG);
			filePan1 = new File(dirFilePan1, nomeDoArquivo + Constantes.EXTENSAO_JPG);
			filePan2 = new File(dirFilePan2, nomeDoArquivo + Constantes.EXTENSAO_JPG);
			fileColeta = new File(dirFileColeta, nomeDoArquivo + Constantes.EXTENSAO_CSV);
			fileMetro = new File(dirFileMetro, nomeDoArquivo + Constantes.EXTENSAO_TXT);
			fileRNA = new File(dirFileRNA, nomeDoArquivo + Constantes.EXTENSAO_TXT);
			fileReal = new File(dirFileReal, nomeDoArquivo + Constantes.EXTENSAO_TXT);	
		}
		
		String porteNomeDoArquivo = nomeDoArquivo.substring(11, 12);
		String cortado[] = nomeDoArquivo.split(porteNomeDoArquivo);
		String nome = cortado[0] + String.valueOf(porte) + cortado[1];
		File dest = null;
		
		if(dirFileOriginal != null && fileOriginal != null && fileOriginal.exists()){
			dest = new File(dirFileOriginal, nome + Constantes.EXTENSAO_TXT);
			fileOriginal.renameTo(dest);
		} if(dirFileNorm != null && fileNorm != null && fileNorm.exists()){
			dest = new File(dirFileNorm, nome + Constantes.EXTENSAO_TXT);
			fileNorm.renameTo(dest);
		} if(dirFileZoom != null && fileZoom != null && fileZoom.exists()){
			dest = new File(dirFileZoom, nome + Constantes.EXTENSAO_JPG);
			fileZoom.renameTo(dest);
		} if(dirFilePan1 != null && filePan1 != null && filePan1.exists()){
			dest = new File(dirFilePan1, nome + Constantes.EXTENSAO_JPG);
			filePan1.renameTo(dest);
		} if(dirFilePan2 != null && filePan2 != null && filePan2.exists()){
			dest = new File(dirFilePan2, nome + Constantes.EXTENSAO_JPG);
			filePan2.renameTo(dest);
		} if(dirFileColeta != null && fileColeta != null && fileColeta.exists()){
			dest = new File(dirFileColeta, nome + Constantes.EXTENSAO_CSV);
			fileColeta.renameTo(dest);
		} if(dirFileMetro != null && fileMetro != null && fileMetro.exists()){
			dest = new File(dirFileMetro, nome + Constantes.EXTENSAO_TXT);
			fileMetro.renameTo(dest);
		} if(dirFileRNA != null && fileRNA != null && fileRNA.exists()){
			dest = new File(dirFileRNA, nome + Constantes.EXTENSAO_TXT);
			fileRNA.renameTo(dest);
		} if(dirFileReal != null && fileReal != null && fileReal.exists()){
			dest = new File(dirFileReal, nome + Constantes.EXTENSAO_TXT);
			fileReal.renameTo(dest);
		}
		
		return nome;
	}
	
	public static String[] criaListFromDir(File diretorio, String extensao){
		List<String> conteudoList = null;
		String[] conteudoString = null;
		
		if(diretorio.isDirectory()){
			String[] array = diretorio.list();
			conteudoList = new ArrayList<String>();
			       
			for (String nomeArquivo : array) {
				if(nomeArquivo.startsWith("E")){
					nomeArquivo = nomeArquivo.split(extensao)[0];
					conteudoList.add(nomeArquivo);
				}
			}
		}
				
		if(conteudoList != null){
			conteudoString = new String[conteudoList.size()];
			conteudoList.toArray(conteudoString);	
		}
		
		return conteudoString;
	}

	
//	public static boolean copiaArquivo(File origemFile, File destinoFile){
//		try{
//			if(!origemFile.exists()){
//				return false;
//			}
//			
//			FileChannel origem = new FileInputStream(origemFile).getChannel();
//			FileChannel destino = new FileOutputStream(destinoFile).getChannel();
//			
//			destino.transferFrom(origem, 0, origem.size());
//			
//			origem.close();
//			destino.close();
//			
//			return true;
//		} catch (FileNotFoundException e1) {
//			e1.printStackTrace();
//			return false;
//		} catch (IOException e2) {
//			e2.printStackTrace();
//			return false;
//		}
//	}
}
